package cn.tedu.search.repository;

import cn.tedu.search.entity.Item;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import org.springframework.stereotype.Repository;

// Repository是Spring家族框架对持久层的名称规范
@Repository
public interface ItemRepository extends ElasticsearchRepository<Item,Long> {

    // ItemRepository接口继承ElasticsearchRepository父接口,是SpringData提供的
    // ElasticsearchRepository接口泛型<[要操作的实体类],[这个实体类的主键类型]>
    // 继承之后,当前接口能够直接调用父接口中声明操作ES的方法,包括基本增删改查


    // SpringData自定义查询
    // 我们要编写一个符合SpringData要求格式的方法名
    // SpringData能够根据我们编写的方法名,推测我们的意图,自动生成能够完成这个操作的语句
    // query(查询):表示当前方法是一个进行查询操作的方法,类似数据库sql中的select
    // Item/Items:表示要查询的实体名称,返回集合类型后应该加s
    // By(通过/根据):表示查询条件开始的关键字,类似sql语句中的where
    // Title:是要查询的字段,可以是Item类中的任何字段
    // Matches(匹配):指定查询操作条件,Matches是匹配参数中分词的查询,类似sql中的like
    Iterable<Item>  queryItemsByTitleMatches(String title);

    // 多条件自定义查询
    // 多个条件之间要使用and或or进行分隔,表示多个条件之间的逻辑关系
    // 我们使用title和brand字段进行多条件查询
    // 参数的数量要匹配字段的数量
    // 声明参数的顺序是向条件赋值的依据,第一个参数会赋值给第一个条件,以此类推,和参数名称无关

    Iterable<Item> queryItemsByTitleMatchesAndBrandMatches(String title,String brand);

    // 排序查询
    // 在方法名称最后添加OrderBy关键字,然后跟排序依据的字段名,默认升序(Asc)设置降序为Desc

    Iterable<Item> queryItemsByTitleMatchesOrBrandMatchesOrderByPriceDesc(String title,String brand);

    // 分页查询
    // 要执行分页查询,需要将返回值类型修改为Page
    // Page类型既能保存查询出的数据,又能保存分页信息,例如:当前页,每页条数,总页数,总条数等
    // 参数方面,要在现有的所有参数后,添加一个类型为Pageable的参数
    // 在调用时,这个pageable能设置要查询的页码和每页条数
    Page<Item> queryItemsByTitleMatchesOrBrandMatchesOrderByPriceDesc(
            String title, String brand, Pageable pageable);






    Iterable<Item> queryItemsByTitleMatchesOrCategoryMatchesOrderByPrice(
                                                String title,String category);



}
